


import bpy

from 全局控制.Node.数据编辑.物体 import bl_修改器公共选项

import engine.initLIB.load_dll as engineLib
import ctypes


from 对象操作 import bl_对象变换帧

import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类
from 全局控制.Node.节点数据类型 import bl_集合数据类型






E_限定方式类型枚举 = [
	("NONE", "None", "", 0),
	("ANGLE", "角度", "", 1),
	("WEIGHT", "权重", "", 2),
	("VGROUP", "顶点组", "", 3),
]

def f_update_修改器可视(self, context):
	修改对象 = self.inputs['修改对象'].f_getData()
	if len(修改对象) <= 0 : return False

	for obj in 修改对象:
		修改器ID = obj.modifiers.find(self.m_修改器名称)
		if 修改器ID >= 0 :
			修改器 = obj.modifiers[修改器ID]
			
			修改器.show_viewport = self.m_是否显示


def f_update_修改器可渲(self, context):
	修改对象 = self.inputs['修改对象'].f_getData()
	if len(修改对象) <= 0 : return False

	for obj in 修改对象:
		修改器ID = obj.modifiers.find(self.m_修改器名称)
		if 修改器ID >= 0 :
			修改器 = obj.modifiers[修改器ID]
			修改器.show_render = self.m_是否渲染



def f_update_修改器可渲(self, context):
	修改对象 = self.inputs['修改对象'].f_getData()
	if len(修改对象) <= 0 : return False

	for obj in 修改对象:
		修改器ID = obj.modifiers.find(self.m_修改器名称)
		if 修改器ID >= 0 :
			修改器 = obj.modifiers[修改器ID]
			修改器.show_render = self.m_是否渲染

	if context :
		self.id_data.f_节点数据更新_更新树([self])
		




class C_Node_切角修改器(基类.C_Node_基类):
	bl_dname = 'bl_node_切角修改器'
	bl_label = '切角修改器'
	bl_icon = 'MOD_BEVEL'

	
	m_修改器名称 = bpy.props.StringProperty(name="修改器名称", default='Bevel')
	m_是否渲染 = bpy.props.BoolProperty(default=True, update=f_update_修改器可渲)
	m_是否显示 = bpy.props.BoolProperty(default=True, update=f_update_修改器可视)
	m_是否编辑模式显示 = bpy.props.BoolProperty()
	
	m_限定方式 = bpy.props.EnumProperty(items=E_限定方式类型枚举, name="限定方式", default="NONE" )
	m_限定角度 = bpy.props.FloatProperty()

	m_投影物体 = bpy.props.CollectionProperty(type=bl_集合数据类型.C_物体组元素)



	def init(self, context):
		super(C_Node_切角修改器, self).f_init(context)

		self.inputs.new('C_Socket_物体_Array1D', name='修改对象')

		self.inputs.new('C_Socket_F32_Array1D', name='宽度')
		self.inputs.new('C_Socket_I32_Array1D', name='段数')
		self.inputs.new('C_Socket_F32_Array1D', name='轮廓')
		self.inputs.new('C_Socket_I32_Array1D', name='材质')

		self.inputs.new('C_Socket_Bool_Array1D', name='切顶点')
		self.inputs.new('C_Socket_Bool_Array1D', name='use_clamp_overlap')
		self.inputs.new('C_Socket_Bool_Array1D', name='loop_slide')
		self.inputs.new('C_Socket_Bool_Array1D', name='mark_seam')
		self.inputs.new('C_Socket_Bool_Array1D', name='mark_sharp')

		self.inputs.new('C_NodeSocket_文本', name='限定方式')
		self.inputs.new('C_Socket_F32_Array1D', name='限定角度')
		
		self.f_toCPP(self.id_data)


	def f_toCPP(self, tree):
		是否更新 = engineLib.flexCAPI.f_创建切角修改器节点(ctypes.c_wchar_p(tree.name), ctypes.c_wchar_p(self.name), self.f_getPyObject(tree));
		if 是否更新 :
			f_update_修改器可渲(self, None)
			f_update_修改器可视(self, None)

			self.inputs['宽度'].f_setData(0.1)
			self.inputs['段数'].f_setData(1)
			self.inputs['轮廓'].f_setData(0.5)
			self.inputs['材质'].f_setData(-1)
			
			self.inputs['切顶点'].f_setData(False)
			self.inputs['use_clamp_overlap'].f_setData(True)
			self.inputs['loop_slide'].f_setData(True)
			self.inputs['mark_seam'].f_setData(False)
			self.inputs['mark_sharp'].f_setData(False)

			self.inputs['限定角度'].f_setData(45.0)

			self.use_custom_color = True
			self.color = bl_UI配色.g_Bl修改器节点颜色


	def draw_buttons(self, context, layout):
		显示选项布局 = layout.row(align=True)
		显示选项布局.prop(self, 'm_修改器名称', icon='MOD_BEVEL')
		显示选项布局.prop(self, 'm_是否渲染', icon='RESTRICT_RENDER_OFF', icon_only=True)
		显示选项布局.prop(self, 'm_是否显示', icon='RESTRICT_VIEW_OFF', icon_only=True)
		显示选项布局.prop(self, 'm_是否编辑模式显示', icon='EDITMODE_HLT', icon_only=True)
		
		layout.separator()
		if self.inputs['限定方式'].is_linked == False:
			layout.prop(self, 'm_限定方式', expand=True, toggle=True)
			
	def update(self):
		pass


	def f_update(self):
		修改对象 = self.inputs['修改对象'].f_getData()
		对象数量 = len(修改对象) 
		if 对象数量 <= 0 : return False
		
		width, width是否独立 = 基类.f_插座数据是否独立(self, '宽度', 对象数量)
		段数, 段数是否独立 = 基类.f_插座数据是否独立(self, '段数', 对象数量)
		轮廓, 轮廓是否独立 = 基类.f_插座数据是否独立(self, '轮廓', 对象数量)
		
		angle_limit, 限定角度是否独立 = 基类.f_插座数据是否独立(self, '限定角度', 对象数量)

		limit_method = ''
		if self.inputs['限定方式'].is_linked:
			limit_method = self.inputs['限定方式'].f_getData()
		else:
			limit_method = self.m_限定方式
		#angle_limit = self.inputs['限定角度'].f_getData()

		index = 0
		for obj in 修改对象:
			修改器ID = obj.modifiers.find(self.m_修改器名称)
			if 修改器ID >= 0 :
				修改器 = obj.modifiers[修改器ID]
			else:
				修改器 = obj.modifiers.new(self.m_修改器名称, 'BEVEL')
				self.m_修改器名称 = 修改器.name
			
			#bl_修改器公共选项.f_set修改器可视(修改器, self.m_是否显示, self.m_是否渲染)
			#print('修改器 = ', 修改器)
			if width是否独立 :
				修改器.width = width[index]
			else:
				修改器.width = width

			if 段数是否独立 :
				修改器.segments	= 段数[index]
			else:
				修改器.segments	= 段数

			if 轮廓是否独立 :
				修改器.profile = 轮廓[index]
			else:
				修改器.profile = 轮廓

			if limit_method :
				#print('limit_method = ', limit_method, angle_limit)
				修改器.limit_method = limit_method
				if 轮廓是否独立 :
					修改器.angle_limit = angle_limit[index]
				else:
					修改器.angle_limit = angle_limit
				
			index += 1




class C_NODE_MENU_切角修改器(bpy.types.Operator):
	bl_idname = 'node.global_node_obj_modifiers_bevel'
	bl_label = '切角修改器'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_切角修改器', use_transform=True)
		return {'FINISHED'}





classes = (
	C_Node_切角修改器,
	C_NODE_MENU_切角修改器,
	
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)


